package br.com.controller.aluno;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;


import br.com.arquitetura.controlador.AbstractMBean;
import br.com.arquitetura.excecoes.BDException;
import br.com.controller.acesso.MBAcessoUsuario;
import br.com.data.hibernate.AlunoHibernateDAO;
import br.com.data.hibernate.AulaHibernateDAO;
import br.com.model.entidade.Aluno;
import br.com.model.entidade.Aula;
import br.com.model.entidade.Diario;
import br.com.model.entidade.Progresso;

@ManagedBean
@ViewScoped
public class MBAulaAluno extends AbstractMBean<Aula>{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private Aula aula;
	private AlunoHibernateDAO alunoHibernateDAO;
	private AulaHibernateDAO aulaHibernateDAO;
	private String arquivo;
	private String caminho = FacesContext.getCurrentInstance().getExternalContext().getRealPath("/") + "arquivo/";
	private Aluno aluno;
	private Progresso progresso;
	private List<Diario> diario;
	private int totalFaltas;
	
	public MBAulaAluno() {
		//Recuperando o id da turma da session
		HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
		Long turma_id = (Long) session.getAttribute("idAulaVizualizacao");
		
		if(turma_id == null){
			try {
				FacesContext.getCurrentInstance().getExternalContext().redirect("/educacao/pages/professor/index.jsf");
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}else{
			
			MBAcessoUsuario acessoUsuario = new MBAcessoUsuario();
			
			aulaHibernateDAO = (AulaHibernateDAO) getBean("aulaHibernateDAO");
			alunoHibernateDAO = (AlunoHibernateDAO) getBean("alunoHibernateDAO");
			
			try {
				aula = aulaHibernateDAO.getById(Aula.class,turma_id);
				aluno = alunoHibernateDAO.getByField(Aluno.class, "usuario", acessoUsuario.getUsuario()).get(0);
				for (Progresso aux : this.aluno.getProgressos()){
					if (aux.getAula().getId().equals(this.aula.getId())){
						this.progresso  = aux;
					}
				}
				
				//Cadastrando diario e as faltas
				this.diario = new ArrayList<Diario>();
				this.totalFaltas = 0;
				for (Diario aux : this.aula.getDiarios()){
					System.out.println(aux.getAluno().getUsuario().getNome());
					if (aux.getAluno().getUsuario().getId().equals(aluno.getUsuario().getId())){
						this.diario.add(aux);
						this.totalFaltas+=aux.getFaltas();
					}
				}
				
				
			} catch (BDException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
			
	}
	
	
	
	 public int getTotalFaltas() {
		return totalFaltas;
	}



	public void setTotalFaltas(int totalFaltas) {
		this.totalFaltas = totalFaltas;
	}



	public List<Diario> getDiario() {
		return diario;
	}

	public void setDiario(List<Diario> diario) {
		this.diario = diario;
	}

	public synchronized void download() {  
		 	File file = new File(caminho+arquivo); 
	        System.out.println("Executei o download");  
	        HttpServletResponse response = (HttpServletResponse)FacesContext.getCurrentInstance().getExternalContext().getResponse();  
	        response.setHeader("Content-Disposition", "attachment;filename=\"" + file.getName() + "\"");  
	        response.setContentLength((int) file.length());  
	        try {  
	            FileInputStream input = new FileInputStream(file);  
	            ServletOutputStream out = response.getOutputStream();  
	            byte[] buffer = new byte[1024];  
	            int i;  
	            while ((i = input.read(buffer)) != -1) {  
	                out.write(buffer, 0, i);  
	            }  
	            out.flush();  
	            out.close();  
	            input.close();  
	            FacesContext.getCurrentInstance().getResponseComplete();  
	        } catch (IOException err) {  
	            err.printStackTrace();  
	        }  
	    }

	public Aula getAula() {
		return aula;
	}
	
	public String getArquivo() {
		return arquivo;
	}

	public void setArquivo(String arquivo) {
		this.arquivo = arquivo;
	}

	public void setAula(Aula aula) {
		this.aula = aula;
	}

	public Aluno getAluno() {
		return aluno;
	}

	public void setAluno(Aluno aluno) {
		this.aluno = aluno;
	}

	public Progresso getProgresso() {
		return progresso;
	}

	public void setProgresso(Progresso progresso) {
		this.progresso = progresso;
	}
	
	
}
